//@author wtfumlomglol
package amm.Graphic;

import java.io.*;
import java.util.*;

//a bankrablot leiro osztaly
public class Criminal extends Vehicle implements IControllable {

    //mozgas utrol
    private Direction direction = Direction.FORWARD;
    //mozgas keresztezodesbol
    private Compass compass = Compass.EAST;
    //tudja jelezni, hogy elkaptak
    private Game g;
    //a bankrablon aktiv bonusz
    private PowerUp powerUp=PowerUp.NOPOWER;
    //a bonuszbol hatralevo korok szamat adja
    private int powerCountDown=0;
    //naplozáshoz a Game naplóját használja
    private Logger logger;


    public Criminal() {
    }

    public Criminal(Game game) {
        this.g = game;
        logger=g.getLogger();
        sign="C";
        tempo=0;
    }

    //akkor hivodik meg, ha egy masik bankrabloval utkozik
    //a jelenlegi specifikacio nem koveteli meg
    //a tobbjatekos modot, igy ez a metodus nem fut soha
    @Override
    public void visit(Criminal cr) {
        logger.addMessage("***COLLISION WITH ANOTHER CRIMINAL***");
    }

    //akkor hivodik, ha civil lep arra a mezore, amin all
    //a jelenlegi specifikacio nem engedi civilek
    //szamara az utkozest, igy ez a metodus nem fut soha
    @Override
    public void visit(Citizen cz) {
        g.wasted();
        g.returnToMenu();
    }

    //akkor hivodik, ha egy rendor azt a mezot vizsgalja, amin all
    //ez a jatek veget jelenti, hiszen elkaptak
    @Override
    public void visit(Police p) {
        logger.addMessage("Criminal was spotted");
        if (powerUp!=PowerUp.EASTERBUNNY || powerCountDown==0)
        {
            g.busted();
            g.returnToMenu();
        }
    }

    //akkor hivodik meg, ha a jatekos onkenyesen megallitja
    //(nem a szkeleton resze), vagy ha egy keresztezodesbe er
    @Override
    public void forceStop() {
        tempo = 0;
        logger.addMessage("Criminal forced to stop");
    }

    @Override
    public void setCompass(Compass c) {
        compass = c;
        tempo=1;
    }

    //a bankrablo kore
    public void onTick() {
        //ha nem all
        if (tempo != 0) {
            //jelzi a mezonek, hogy tavozik az o altala megadott iranyba
            if (direction == Direction.FORWARD) {
                occupies.leave(true, compass);
            } else {
                occupies.leave(false, compass);
            }
        }
        //ha all, tovabbadja a kort
        else {
            logger.addMessage("Criminal skipped turn");
        }
        if (powerCountDown!=0)
        {
            powerCountDown--;
            if (powerCountDown==0)
            {
                setPower(PowerUp.NOPOWER);
            }
        }
    }

    //a bankrablo elmozdul
    public void moveTo(Field f) {
        //elmenti az aktualis mezot
        Field prev = occupies;
        Place nextPlace;
        //ha az uj mezo kulonbozik
        if (prev != f) {
            //atirja az aktualis mezot
            occupies = f;
            //felveszi az esetleges bonuszt
            occupies.consume();
            logger.addMessage("Criminal moved to "+f.getName());
            //ha az elozo letezett - [csak inicializacional nem]
            //felszabaditja azt
            if (prev != null) {
                prev.clear();
            }
            //lekerdezi az adott mezo tipusat
            nextPlace = occupies.getPlace();
            //ha rejtekhelyre ert, megnyerte a jatekot
            if (nextPlace == Place.HIDEOUT) {
                g.winGame();
                g.returnToMenu();
            }
            else if (nextPlace == Place.POLICEDEPT) {
                g.busted();
                g.returnToMenu();
            }
        }
        //ha az uj mezo megegyezik a regivel, nem mozdul
        else {
            logger.addMessage("Criminal didn't move.");
        }

        
    }

    public Field getField(){
        return occupies;
    }

    public Direction getDirect(){
        return direction;
    }

    public void setDirection(Direction d)
    {
        direction=d;
    }

    //beállítja az aktív bonuszt
    public void setPower(PowerUp p)
    {
        powerUp=p;
        switch (powerUp)
        {
            case NOPOWER:
                sign="C";
                break;
            case EASTERBUNNY:
                sign="y";
                logger.addMessage("Easter Rabbit was run over on " + occupies.getName());
                break;
        }
        if (powerUp!=PowerUp.NOPOWER) powerCountDown=10;
        else powerCountDown=0;
    }
}
